


/**
 * 1. 使用 JSON.stringify() 和JSON.parse()
 * 数据结构简单的话可以使用。
 * 缺点： 无法转换函数、无法转换Map Set、无法转换循环引用
 * 
 * 2. 使用Object.assign()
 * 它不是深拷贝，多层的object引用，会被其他引用修改
 * 
 * 3. 普通深拷贝
 * 只考虑Object Array，无法转换Map、Set和循环引用
 */

function deepClone (targetObj){
    if(typeof targetObj !== 'object' || typeof targetObj == null){
        return targetObj;
    }

    let result:any;

    if(targetObj instanceof Array){
        result = [];
    } else {
        result = {};
    }

    for(const key in targetObj){
        if(targetObj.hasOwnProperty(key)){
            result[key] = deepClone(targetObj[key]);
        }
    }

    return result;
}

const obj = {
    name: 'jeff',
    info: {
        city: 'beijing'
    }
}
// const obj1 = deepClone(obj);
// obj1.info.city = 'shangHai';
// console.log(obj.info.city);

// const obj2 = Object.assign({}, obj);
// obj2.info.city = 'shangHai';
// console.log(obj.info.city);

const obj3 = {...obj};
obj3.info.city = 'shangHai';
console.log(obj.info.city);